Introduction à R
Statistique descriptive univariée et bivariée
1) Acquérir les bases du logiciel/language R et de son environnement RStudio
2) Réviser les bases de la statistique descriptive univariée et bivariée en géographie
3) Comprendre les atouts de R pour la gestion, l’analyse et la représentation de données
Avant de démarrer la pratique, nous allons introduire la logicel/langage R et l’IDE Rstudio. Pour cela, nous utiliserons deux diaporamas :
-> Partie 1 : Contextualisation et présentation de R et Rstudio
-> Partie 2 : Base du langage, packages, Rstudio et documentation
1 Prise en main
1.1 L’interface Rstudio
L’interface de RStudio se présente sous la forme d’une unique fenêtre découpée en quatre zones que l’on peut redimensionner, masquer ou maximiser selon ses préférences :
Cette zone permet l’édition de fichiers source R (avec coloration syntaxique et autocomplétion).
La console avec la session R en cours d’exécution. La console affiche à la fois le code exécuté, ses résultats associés, ainsi que les avertissements (warnings) et messages d’erreur éventuels (errors).
Cette zone permet de lister, typer et visualiser les objets créés par l’exécution du code R.
Un explorateur de fichiers, une fenêtre graphique, une fenêtre de gestion des packages et de la documentation associée aux fonctions et packages.
RStudio propose de nombreuses fonctionnalités intéressantes, par exemple :
- La création de projet
- Les boutons raccourcis
- L’autocomplétion
- Raccourcis clavier
Alt+-renvoie l’opérateur d’assignation accompagné d’un espace avant et un espace après (<-)
Ctrl+Entréeexécute le code écrit dans la fenêtre d’édition (script)Ctrl+1etCtrl+2permettent de passer de la console à l’éditeur de code et vice versa
shift+alt+kpour accéder à l’ensemble des raccourcis.
RStudio dispose d’une fonctionnalité très pratique pour organiser son travail en différents projets. L’idée principale est de réunir tous les fichiers et documents relatifs à un même projet (que ce soit les données, les scripts, les rapports automatisés…) dans un répertoire dédié. L’onglet Projects est situé en haut à droite de l’interface.
Plusieurs actions comme la création et le chargement de programme, l’import de données, l’installation et le chargement de packages, l’accés à la documentation, la visualisation des objets, l’export de figures… sont exécutables en un simple clic.
RStudio présente aussi la capacité de compléter automatiquement les termes en cours d’écriture. L’autocomplétion fonctionne avec la touche Tab du clavier. Cela aide l’utilisateur dans la saisi des noms d’objet, de fonction, de variable, et même des arguments de fonction.
RStudio propose de nombreux raccourcis clavier intéressants, exemple :
1.2 Paramètres généraux
Pour éviter des problèmes d’encodage des scripts ou le chargement incessant de données à chaque nouvelle instance de Rstudio, il est necessaire de modifier certains paramètres globaux. Pour cela, cliquez sur tools puis sur Global Options pour ouvrir la fenêtre des paramètre généraux de Rstudio.
Dans un premier temps, décochez les options de restoration et de sauvegarde de données à l’ouverture et à la fermeture de session :
Puis, dans l’onglet code et le sous-onglet saving, paramétrez l’encodage en UTF-8 pour que les scripts crées s’affichent correctement en cas d’ouverture dans un autres systèmes d’exploitation :
1.3 Les projets
Cette fonctionnalité permet d’organiser son travail en différents projets. L’idée principale est de réunir tous les fichiers relatifs à un même projet (quelque soit leur format) dans un répertoire dédié. Le menu “Project” est accessible via une icône dédiée située tout en haut à droite :
Dans le menu Project, sélectionnez l’option New project :
Dans un nouveau répertoire, créez un projet vide. Indiquez le nom de votre projet, qui sera également le nom du répertoire créé pour stocker les données du projet. Puis, indiquez le répertoire parent, dans lequel votre projet sera créé :
1.4 Les objets
Tout ce qui est créé et manipulé sous R est un objet. Ces objets permettent de stocker et de structurer les données.
Les objets peuvent stocker différents types de données. Voici les principaux :
- La chaine de caractères (string)
Il s’agit d’une suite ordonnée de caractères. Ex : “Ma chaîne de caractères” ou “234”
- Nombre entier (integer)
Il s’agit d’un nombre sans décimale (sans virgule). Ex : 347
- Nombre réel (numeric)
Il s’agit d’un nombre décimale. Ex : 86.6
- Valeur logique ou booléenne (logical)
Une variable booléenne est une variable qui ne prend que deux valeurs : true (vrai) et false (faux) ou O et 1
1.4.1 Créer un objet
Un objet peut être créé avec l’opérateur « assigner » (<-), une flèche composée du signe inférieur (<) accolé à un tiret (-). Si l’objet existe déjà, sa valeur précédente est remplacée par la nouvelle. La valeur renvoyée peut être le résultat d’une opération et/ou d’une fonction :
## [1] "chaîne de caractères"
## [1] 24
On peut également écrire une expression sans assigner son résultat ou sa valeur à un objet, le résultat est alors affiché à l’écran mais n’est pas stocké dans un objet en mémoire :
## [1] 60
# Pour enregister le résultat en mémoire, on l'assigne dans un objet, ex :
Mon_objet <- (10 + 2) * 51.4.2 La fonction
Le logiciel R dispose de fonctions préprogrammées appelées fonctions primitives ou basiques et regroupés dans le package base qui est automatiquement chargé. Pour connaître toutes les fonctions primitives, utilisez la fonction library(help = “base”) :
library(help = "base")
# Quelques exemples...
# class() Connaitre la classe de données d'un élément
# as.character() Assigner la class 'caractere' à un élement
# is.numeric() Tester si un élément est numéric (réponse TRUE ou FALSE)
# paste() Coller des chaine de caractère
# unlist() permet de transformer une liste en vecteurPour utiliser une fonction, il suffit d’écrire son nom, puis de spécifier des arguments entre parenthése.
Exemple de fonctions permettant d’assigner ou de modifier la classe d’un objet :
# Les différentes fonctions permettant de modifier la classe de l'objet 'mon_objet' :
as.vector(x='mon_objet')
as.data.frame(x='mon_objet')
as.matrix(x='mon_objet')
as.array(x='mon_objet')
as.list(x='mon_objet')
as.factor(x='mon_objet')## [1] "character"
## [1] "numeric"
Dans la plupart des cas, les arguments d’une fonction sont prédéfinis. Il est donc important de se renseigner sur les différents arguments d’une fonction et ses valeurs paramétrées par défault. Attention, certains arguments n’ont pas de valeur prédéfinie mais doivent obligatoirement être renseigné.
Exemple avec la fonction mean() :
notes <- c(11,13,15,17,10,8,14,13,12,15,19,NA)
# Il est évidemment obligatoire de spécifier le vecteur de valeurs sur lequel on calcul une moyenne !
mean(notes)## [1] NA
La fonction mean() retourne NA car la série statistique présente une valeur manquante (NA). L’arguments na.rm (= FALSE par défault) permet de ne pas prendre en compte les valeurs manquantes :
# na.rm (= FALSE par défault) permet de prendre en compte ou non les valeurs NA
mean(notes, na.rm = TRUE)## [1] 13.36364
L’utilisateur a également la possibilité de définir ses propres fonctions. Une fonction est mise dans une variable contenant un bloc d’instructions introduit par la commande function(). La syntaxe générale est :
Exemple :
# Ecriture une fonction
carre <- function(x) {
y <- x*x
return(y)
}
# Pour afficher le code source d'une fonction (non primitive),
# écrire son nom sans parenthèse :
carre## function(x) {
## y <- x*x
## return(y)
## }
# Utiliser une fonction :
# fonction(argument1=... , argument2=..., argument3=..., ... )
# Exemple :
# carre(x=3) ou plus simplement :
carre(3)## [1] 9
Si vous souhaitez utiliser une fonction issue d’un package spécifique, vous devez d’abord installer le package et chargez la library :
# Installation du package
install.packages("foreign")
# Chargement de la library
library(foreign)
# Utilisation de la fonction read.dbf() de la library "foreign"
# L'argument as.is permet de convertir ou non les vecteurs en facteurs
read.dbf("D:/users/geographie/Documents/nom_fichier.dbf", as.is = FALSE)1.4.3 Le vecteur
Un vecteur permet de regrouper des éléments d’une même classe.
# Joindre des éléments dans un vecteur
mon_vecteur <- c(1,2,3,4,5,6,7,8,9)
mon_vecteur <- c("A","B","C","D","E")
mon_vecteur <- c("nom", "prenom", 10, 20.78, TRUE)
mon_vecteur## [1] "nom" "prenom" "10" "20.78" "TRUE"
## [1] 2.0 2.5 3.0
## [1] 1 2 1 2 1 2
## [1] 1 1 1 2 2 2
## [1] 1 2 3 4 5 6 7
# Ajouter un element à un vecteur
mon_vecteur_new <- c(mon_vecteur, "Un Element Supplémentaire")
# Interroger les élements d'un vecteur -> mon_vecteur[element]
# Elément 2
mon_vecteur[2]## [1] 2
## [1] 2 3 4
## [1] 2 5
1.4.4 Le data frame
Un data frame est utilisé pour stocker une table de données. Il s’agit d’une liste de vecteurs de même longueur.
# Construction de trois vecteurs
personne <- c('John Doe','Peter Gynn','Jolie Hope','John snow')
salaire <- as.integer(c(21000, 23400, 26800, 32700))
date <- as.Date(c('2010-11-1','2008-3-25','2007-3-14', '1678-1-23'))
# Construction du data.frame à partir de trois vecteurs de même longueur
mon_tableau <- data.frame(personne, salaire, date)
mon_tableau## personne salaire date
## 1 John Doe 21000 2010-11-01
## 2 Peter Gynn 23400 2008-03-25
## 3 Jolie Hope 26800 2007-03-14
## 4 John snow 32700 1678-01-23
# Ajouter une variable
mon_tableau$New_col_1 <- "mon_texte"
mon_tableau$New_col_2 <- c(1,2,3,4)
mon_tableau## personne salaire date New_col_1 New_col_2
## 1 John Doe 21000 2010-11-01 mon_texte 1
## 2 Peter Gynn 23400 2008-03-25 mon_texte 2
## 3 Jolie Hope 26800 2007-03-14 mon_texte 3
## 4 John snow 32700 1678-01-23 mon_texte 4
## personne salaire date New_col_1 New_col_2
## 2 Peter Gynn 23400 2008-03-25 mon_texte 2
## personne date
## 1 John Doe 2010-11-01
## 2 Peter Gynn 2008-03-25
## 3 Jolie Hope 2007-03-14
## 4 John snow 1678-01-23
## [1] "John Doe" "Peter Gynn" "Jolie Hope" "John snow"
## [1] "John snow"
## [1] "John snow"
1.4.5 La liste
Une liste est un vecteur d’objets. Il permet de stocker différents types d’objets dans un seul objet.
ma_fonction <- function() {cat("hello")}
mon_vecteur1 <- c('John Doe','Peter Gynn','Jolie Hope','John snow')
mon_vecteur2 <- as.Date(c('2010-11-1','2008-3-25','2007-3-14', '1678-1-23'))
mon_tableau <- data.frame(mon_vecteur1, mon_vecteur2)
# Création d'une liste
ma_liste <- list(ma_fonction, mon_vecteur1, mon_vecteur2,mon_tableau)
ma_liste## [[1]]
## function() {cat("hello")}
##
## [[2]]
## [1] "John Doe" "Peter Gynn" "Jolie Hope" "John snow"
##
## [[3]]
## [1] "2010-11-01" "2008-03-25" "2007-03-14" "1678-01-23"
##
## [[4]]
## mon_vecteur1 mon_vecteur2
## 1 John Doe 2010-11-01
## 2 Peter Gynn 2008-03-25
## 3 Jolie Hope 2007-03-14
## 4 John snow 1678-01-23
# Ajouter un élément à une liste
ma_liste[[length(ma_liste) + 1]] <- "J'ajoute un objet à ma liste"
# Interroger les objets d'une liste -> ma_list[[élement]][sous element]
# Objet 1
ma_liste[5]## [[1]]
## [1] "J'ajoute un objet à ma liste"
## [[1]]
## [1] "John Doe" "Peter Gynn" "Jolie Hope" "John snow"
##
## [[2]]
## [1] "2010-11-01" "2008-03-25" "2007-03-14" "1678-01-23"
## [[1]]
## [1] "John Doe" "Peter Gynn" "Jolie Hope" "John snow"
##
## [[2]]
## [1] "2010-11-01" "2008-03-25" "2007-03-14" "1678-01-23"
##
## [[3]]
## [1] "J'ajoute un objet à ma liste"
## [1] "2008-03-25"
1.4.6 La matrice
Une matrice est un tableau d’objet de même type, à double entrée.
ma_matrice <- matrix(c(1:16), nrow=4, ncol=4)
# On navigue dans une matrice de la même façon que dans un data frame -> ma_matrice[ligne, colonne]
ma_matrice[4,3]## [1] 12
De nombreuses opérations et fonctions primitives sont applicables à cet objet. Quelques exemples :
## [,1] [,2] [,3] [,4]
## [1,] 1 25 81 169
## [2,] 4 36 100 196
## [3,] 9 49 121 225
## [4,] 16 64 144 256
## [,1] [,2] [,3] [,4]
## [1,] 1 2 3 4
## [2,] 5 6 7 8
## [3,] 9 10 11 12
## [4,] 13 14 15 16
## [1] 1 6 11 16
## [1] 7 8 9 10
## [1] 10 26 42 58
1.4.7 Le Simple Feature data frame
L’objet sf est en quelque sorte une table de données géographique. Il permet de gérer de l’information spatiale. Il s’agit tout simplement d’un dataframe qui stocke également des geométries.
# Création d'un vecteur de nombre (1 à 10)
ID <-seq(1:10)
# Création d'un vecteur de lettres (a à j)
name <-letters[1:10]
latitude <- c(48.84905, 48.85217, 48.83349, 48.86528, 48.86409, 48.85176, 48.85207, 48.88334, 48.85758, 48.87391)
longitude <- c(2.331454, 2.347332, 2.318518, 2.371150, 2.356515, 2.299024, 2.358712, 2.333936, 2.352751, 2.343179)
mes_donnees <- data.frame(ID, name, latitude, longitude)
library(sf)
mes_donnees_SF <- st_as_sf(mes_donnees, coords = c("longitude", "latitude"), crs = 4326, agr = "constant")
mes_donnees_SF## Simple feature collection with 10 features and 2 fields
## Attribute-geometry relationship: 2 constant, 0 aggregate, 0 identity
## Geometry type: POINT
## Dimension: XY
## Bounding box: xmin: 2.299024 ymin: 48.83349 xmax: 2.37115 ymax: 48.88334
## CRS: EPSG:4326
## ID name geometry
## 1 1 a POINT (2.331454 48.84905)
## 2 2 b POINT (2.347332 48.85217)
## 3 3 c POINT (2.318518 48.83349)
## 4 4 d POINT (2.37115 48.86528)
## 5 5 e POINT (2.356515 48.86409)
## 6 6 f POINT (2.299024 48.85176)
## 7 7 g POINT (2.358712 48.85207)
## 8 8 h POINT (2.333936 48.88334)
## 9 9 i POINT (2.352751 48.85758)
## 10 10 j POINT (2.343179 48.87391)
# Interroger un objet sf
# Fonctionne comme pour un data frame pour les différentes variables
# Colonne 'ID'
mes_donnees_SF$ID## [1] 1 2 3 4 5 6 7 8 9 10
## [1] "c"
## Geometry set for 1 feature
## Geometry type: POINT
## Dimension: XY
## Bounding box: xmin: 2.318518 ymin: 48.83349 xmax: 2.318518 ymax: 48.83349
## CRS: EPSG:4326
1.4.8 Le facteur
Un facteur (factor) est un vecteur contenant uniquement certaines valeurs prédéfinies. Les valeurs pré-définies sont appelées des levels.
## [1] "West" "West" "South" "North" "North" "East" "North" "North" "North"
## [10] "North" "South" "North" "East"
## [1] "character"
# Conversion en facteur
my_factor <- factor(my_factor)
# Comment se structure le facteur
str(my_factor)## Factor w/ 4 levels "East","North",..: 4 4 3 2 2 1 2 2 2 2 ...
# Interroger les éléments d'un factor -> factor[element]
# levels() permet d'obtenir la liste des valeurs :
levels(my_factor)## [1] "East" "North" "South" "West"
## East North South West
## 2 7 2 2
## [1] North
## Levels: East North South West
## [1] North North North North South North East
## Levels: East North South
1.5 Les opérateurs
1.5.1 Arithémtiques
## [1] 10
## [1] 0
## [1] 1
## [1] 25
## [1] 3125
1.5.2 Relationel
< # inférieur à
> # supérieur à
<= # inférieur ou égal à
>= # supérieur ou égal à
== # égal
!= # différent
%in% # Test de présence entre deux vecteurs## [1] TRUE
## [1] FALSE
## [1] FALSE TRUE FALSE
1.5.3 Logique
! # Négation
&, && # ET
|, || # OU inclusif
xor(,) # OU exclusif (retournera TRUE si l'une ou l'autre mais pas les deux sont vraies)
is.na() # Valeur manquante ?
is.null() # Valeur Null ?
is.character() # Caractère ?
is.numeric() # Numérique ?# Exemples
# Selection dans un data frame avec plusieus conditions (ET)
mtcars[mtcars$mpg %in% c(21.0,14.3,22.8,19.2) & mtcars$hp != 123 & mtcars$wt >= 3, ]## mpg cyl disp hp drat wt qsec vs am gear carb
## Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4
## Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2
## Pontiac Firebird 19.2 8 400.0 175 3.08 3.845 17.05 0 0 3 2
# Selection dans un data frame avec plusieus conditions (OU)
mtcars[mtcars$mpg %in% c(21.0,14.3,22.8,19.2) | mtcars$hp != 123 | mtcars$wt >= 3, ]## mpg cyl disp hp drat wt qsec vs am gear carb
## Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
## Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
## Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
## Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
## Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
## Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1
## Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4
## Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
## Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2
## Merc 280 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4
## Merc 280C 17.8 6 167.6 123 3.92 3.440 18.90 1 0 4 4
## Merc 450SE 16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3
## Merc 450SL 17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3
## Merc 450SLC 15.2 8 275.8 180 3.07 3.780 18.00 0 0 3 3
## Cadillac Fleetwood 10.4 8 472.0 205 2.93 5.250 17.98 0 0 3 4
## Lincoln Continental 10.4 8 460.0 215 3.00 5.424 17.82 0 0 3 4
## Chrysler Imperial 14.7 8 440.0 230 3.23 5.345 17.42 0 0 3 4
## Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
## Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
## Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
## Toyota Corona 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1
## Dodge Challenger 15.5 8 318.0 150 2.76 3.520 16.87 0 0 3 2
## AMC Javelin 15.2 8 304.0 150 3.15 3.435 17.30 0 0 3 2
## Camaro Z28 13.3 8 350.0 245 3.73 3.840 15.41 0 0 3 4
## Pontiac Firebird 19.2 8 400.0 175 3.08 3.845 17.05 0 0 3 2
## Fiat X1-9 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1
## Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2
## Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2
## Ford Pantera L 15.8 8 351.0 264 4.22 3.170 14.50 0 1 5 4
## Ferrari Dino 19.7 6 145.0 175 3.62 2.770 15.50 0 1 5 6
## Maserati Bora 15.0 8 301.0 335 3.54 3.570 14.60 0 1 5 8
## Volvo 142E 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2
## [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [16] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [31] TRUE TRUE
1.6 Les packages
R fourni directement un important nombre de fonctions pré-installées, stockées dans ce qui est appelé le R Base Package. Il n’est pas nécessaire de les installer ou de les charger, elles sont imédiatement utilisables. À ce jour, 2292 fonctions sont proposées par le le R-base.
Les fonctions du r-base permettent d’effectuer les manipulations de données les plus classiques. Pour effectuer des traitements plus spécifiques, il est nécessaire d’installer des packages mise à disposition par d’autres utilisateurs sur le CRAN.
Les packages sont des collections de fonctions, associées à de la documentation et parfois même à des données. 18095 packages supplémentaires étaient mis à disposition le 30 août 2021 sur le CRAN. Tous les packages disponibles sur The Comprehensive R Archive Network ont été controlés. Leur fonctionnement technique (uniquement) est garanti, car il s’agit d’un depôt officiel de packages.
Il est également possible d’installer des packages en cours de développement et mise à disposition sur un GIT ou d’installer un package stocké en .tar.gz sur votre machine.
Installer un package en language R :
# Pour les packages disponibles sur le CRAN :
install.packages("cartography") # Installer un package
update.packages("cartography") # Mettre à jour un package
# Pour obtenir le chemin de la librarie contenant les packages installés
.libPaths()
# Pour voir tous les packages installés
library()
# Pour les packages stockés en local et compressés en tar.gz. Ex (NOT RUN) :
install.packages("C:\\RJSONIO_0.2-3.tar.gz", repos = NULL, type="source")
# Pour les packages en cours de développement sur un GIT,
# il est nécessaire d'installer et de charger le package remotes :
install.packages("remotes")
library(remotes)
install_github("riatelab/MTA")Une fois installé, un package doit être chargé à chaque nouvelle session de R pour être utilisé. A un package est systématiquement associée de la documentation permettant de comprendre son contenu et aider à sa prise en main.
# Charger un package pour en utiliser ses fonctions
library(cartography)
# Utiliser directement une fonction d'un package
cartography::propSymbolsChoroLayer()
# Pour charger des données implementées dans un package
data(Nom_objet)L’interface RStudio permet également l’installation et le chargement manuel des packages :
1.7 Aide et documentation
Il y a plusieurs façons d’obtenir de l’aide avec R studio. Vous pouvez utiliser l’onglet d’aide proposé par Rstudio et accéder à la documentation d’une fonction :
Il est possible d’obtenir de la documentation en utilisant des fonctions, Ex :
# Documentation des packages
help("cartography")
# Accèder à la documentation d'une fonction
?choroLayer
# Accèder à une vignette (falcutatif) de package
vignette(topic = "cartography", package = "cartography")
# Accèder à une cheatsheet (falcutatif) de package
vignette(topic = "cheatsheet", package = "cartography")
# Chercher documentation par mot clé
help.search("Map")Exemple de la cheatsheet (antisèche) du package “cartography” :
Ne négligez pas le service d’autocomplétion proposé par RStudio. C’est un véritable assistant de programmation. Il permet par exemple de s’assurer du bon orthographe d’un objet ou d’une fonction ou de connaître les différents arguments possibles d’une fonction. Pour cela il suffit d’utiliser la touche tab lors de la saisie. RStudio vous proposera alors les possibilités qui s’offrent à vous.
Enfin, internet est une ressource documentaire trés riche pour R. Vous y trouverez toujours une réponse à vos questions, et presque toujours en français !
1.8 Règles de codage
Les règles de codage permettent d’écrire un code plus clair et plus lisible pour soi et pour les autres. Vous pourrez trouver plusieurs propositions de coding style car il n’existe pas de style officiel pour le logiciel R. Quelque soit le style choisi l’idée est de conserver le même tout au long d’un programme.
Voir par exemple :
Troix règles font tout de même l’unanimité :
- Eviter les lignes de plus de 80 charactères.
- Utiliser un espace avant et après les opérateurs :
# Préférez
x <- 12
# à
x<-12
# Préférez
average <- mean(feet / 12 + inches, na.rm = TRUE)
# à
average<-mean(feet/12+inches,na.rm=TRUE)- Eviter les lignes avec plus d’une opération :
### Il est possible d'écrire plusieurs opération sur une me ligne, en les séparant d'un ;
# Exemple
notes <- c(4,2,8,6,5,9,3,2,5,6); mean(notes); sd(notes)
# Mais cela est à proscrire.
# Pour plus de visibilité, préférez :
notes <- c(4,2,8,6,5,9,3,2,5,6)
mean(notes)
sd(notes)L’intégration de commentaire dans le code est également une pratique appréciée. Pour cela, insérer un # en début de ligne.
# Les caractères suivants seront considérés comme du commentaire
# Vous pouvez écrire ce que vous voulez, mais toujours précédé d'un #
# une chaîne de 5# (#####) permet de créer de bloc de code dépliable :
######
mean(c(1,7,3,2,8,9,2,3))1.9 Manipulations basiques
1.9.1 Sauvegarder et supprimer des objets
Il est possible de supprimer tous les objets crées en cliquant sur l’icône dans la fenêtre de l’espace de travail. Plusieurs fonction permettent également de gérer les objets. En voici quelques-unes :
# lister tous les objets crées
ls()
# Supprimer un objet, ex : rm(mon_objet)
rm()
# Supprimer tous les objets
rm(list=ls())
# Sauvegarder un objet dans un fichier (format rds)
saveRDS()
# Lire un fichier rds pour charger l'objet stocké
readRDS() Exemple pratique :
mon_objet <- c("un", "deux", "trois")
# Sauvegarde d'un objet dans un fichier
saveRDS(mon_objet, file="Nom_du_fichier")
# Suppression de l'objet TEMPORAIRE
rm(mon_objet)
# Lecture du fichier et assignation dans un objet
mon_objet_new <- readRDS("Nom_du_fichier") 1.9.2 Import/export de données
Il est possible d’importer et d’exporter des données sous différents format. Pour cela, une série de fonctions (primitives ou non) peut être utilisées. Quelques exemples :
### IMPORTER
read.table() # Importer une table (format multiple)
read.csv() # Fichier csv
read.xlsx() # Fichier Excel -> library(xlsx)
read_sas() # Fichier sas -> library(haven)
read.dbf() # Fichier dbf -> library(foreign)
read_sf() # Fchier shape <- library(sf)Pour que l’import soit correct, il est souvent nécessaire de renseigner un certain nombre d’arguments, comme par exemple :
header = valeur logique qui indique si la première ligne du fichier importé contient les noms des variables.
sep = Indique le séparateur de champ du fichier.
stringsAsFactor = Le données de type caractère sont transformées (par défaut) en facteur.
Encoding = Indique l’encodage utilisé pour les chaînes de caractères.
# Import d'un fichier
# not run
Mon_Objet <- read.table("/data/user/documents/mes.donnes.csv"), header=TRUE, sep=",",
stringsAsFactors=FALSE, encoding="UTF-8")### EXPORTER
## Table de données
write.table(Mon_Objet, "c:/mydata.txt", sep="\t")
# fomrat csv
write.csv(Mon_Objet, file = "MyData.csv")
# format Excel -> library(xlsx)
write.xlsx(Mon_Objet, "c:/mydata.xlsx")
# format sas, spss... -> library(foreign)
write.foreign(Mon_Objet, "c:/mydata.txt", "c:/mydata.sas", package="SAS")
write.foreign(Mon_Objet, "c:/mydata.txt", "c:/mydata.sps", package="SPSS")
# format shape
st_write()
## Figures plot()
# format jpeg
jpeg()
# format png
png()
# format pdf
pdf()
# Exemple d'enregistrement d'une figure :
jpeg('rplot.jpg')
plot(runif(10, 1, 100),runif(10, 1, 100))
dev.off()Il est possible de télécharger un fichier mis à disposition en ligne, avec la fonction :
1.9.3 Interroger un objet
Pour les exemples ci-dessous, l’objet dataframe mtcars est utilisé. Il s’agit d’un exemple de data frame, directement implanté dans R.
## 'data.frame': 32 obs. of 11 variables:
## $ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
## $ cyl : num 6 6 4 6 8 6 8 4 4 6 ...
## $ disp: num 160 160 108 258 360 ...
## $ hp : num 110 110 93 110 175 105 245 62 95 123 ...
## $ drat: num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
## $ wt : num 2.62 2.88 2.32 3.21 3.44 ...
## $ qsec: num 16.5 17 18.6 19.4 17 ...
## $ vs : num 0 0 1 1 0 1 0 1 1 1 ...
## $ am : num 1 1 1 0 0 0 0 0 0 0 ...
## $ gear: num 4 4 4 3 3 3 3 4 4 4 ...
## $ carb: num 4 4 1 1 2 1 4 2 2 4 ...
## mpg cyl disp hp drat wt qsec vs am gear carb
## Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
## Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
## Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
## Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
## Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
## Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
## mpg cyl disp hp drat wt qsec vs am gear carb
## Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.7 0 1 5 2
## Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.9 1 1 5 2
## Ford Pantera L 15.8 8 351.0 264 4.22 3.170 14.5 0 1 5 4
## Ferrari Dino 19.7 6 145.0 175 3.62 2.770 15.5 0 1 5 6
## Maserati Bora 15.0 8 301.0 335 3.54 3.570 14.6 0 1 5 8
## Volvo 142E 21.4 4 121.0 109 4.11 2.780 18.6 1 1 4 2
## mpg cyl disp hp
## Min. :10.40 Min. :4.000 Min. : 71.1 Min. : 52.0
## 1st Qu.:15.43 1st Qu.:4.000 1st Qu.:120.8 1st Qu.: 96.5
## Median :19.20 Median :6.000 Median :196.3 Median :123.0
## Mean :20.09 Mean :6.188 Mean :230.7 Mean :146.7
## 3rd Qu.:22.80 3rd Qu.:8.000 3rd Qu.:326.0 3rd Qu.:180.0
## Max. :33.90 Max. :8.000 Max. :472.0 Max. :335.0
## drat wt qsec vs
## Min. :2.760 Min. :1.513 Min. :14.50 Min. :0.0000
## 1st Qu.:3.080 1st Qu.:2.581 1st Qu.:16.89 1st Qu.:0.0000
## Median :3.695 Median :3.325 Median :17.71 Median :0.0000
## Mean :3.597 Mean :3.217 Mean :17.85 Mean :0.4375
## 3rd Qu.:3.920 3rd Qu.:3.610 3rd Qu.:18.90 3rd Qu.:1.0000
## Max. :4.930 Max. :5.424 Max. :22.90 Max. :1.0000
## am gear carb
## Min. :0.0000 Min. :3.000 Min. :1.000
## 1st Qu.:0.0000 1st Qu.:3.000 1st Qu.:2.000
## Median :0.0000 Median :4.000 Median :2.000
## Mean :0.4062 Mean :3.688 Mean :2.812
## 3rd Qu.:1.0000 3rd Qu.:4.000 3rd Qu.:4.000
## Max. :1.0000 Max. :5.000 Max. :8.000
## [1] "data.frame"
## [1] 11
## [1] "mpg" "cyl" "disp" "hp" "drat" "wt" "qsec" "vs" "am" "gear"
## [11] "carb"
## [1] "mpg" "cyl" "disp" "hp" "drat" "wt" "qsec" "vs" "am" "gear"
## [11] "carb"
## [1] "Mazda RX4" "Mazda RX4 Wag" "Datsun 710"
## [4] "Hornet 4 Drive" "Hornet Sportabout" "Valiant"
## [7] "Duster 360" "Merc 240D" "Merc 230"
## [10] "Merc 280" "Merc 280C" "Merc 450SE"
## [13] "Merc 450SL" "Merc 450SLC" "Cadillac Fleetwood"
## [16] "Lincoln Continental" "Chrysler Imperial" "Fiat 128"
## [19] "Honda Civic" "Toyota Corolla" "Toyota Corona"
## [22] "Dodge Challenger" "AMC Javelin" "Camaro Z28"
## [25] "Pontiac Firebird" "Fiat X1-9" "Porsche 914-2"
## [28] "Lotus Europa" "Ford Pantera L" "Ferrari Dino"
## [31] "Maserati Bora" "Volvo 142E"
## [1] 32 11
## [1] 11
## [1] 32
1.9.4 Séléction par attributs
Comme pour toute les opérations dans R, il existe plusieurs solutions :
## mpg cyl disp hp drat wt qsec
## Merc 240D 24.4 4 146.7 62 3.69 3.19 20.0
## Merc 230 22.8 4 140.8 95 3.92 3.15 22.9
## mpg cyl disp hp drat wt qsec
## Merc 240D 24.4 4 146.7 62 3.69 3.19 20.0
## Merc 230 22.8 4 140.8 95 3.92 3.15 22.9
# Methode 3, fonction filter() du package 'dplyr'
library(dplyr)
mtcars %>%
select(1:6) %>%
filter(cyl==4, wt > 3)## mpg cyl disp hp drat wt
## Merc 240D 24.4 4 146.7 62 3.69 3.19
## Merc 230 22.8 4 140.8 95 3.92 3.15
1.9.5 Joindre
# Construction de deux dataframe avec un identifiant commun
ID <- as.character(c(1, 2, 3, 4))
Prenom <- c('John','Peter','Jolie','John')
Nom <- c('Doe','Gynn','Hope','snow')
# Dataframe 1
mon_tab_1 <- data.frame(ID, Prenom)
# Dataframe 2
mon_tab_2 <- data.frame(ID, Nom)
# Jointure des deux objets avec la fonction merge()
merge(mon_tab_1, mon_tab_2, by="ID")## ID Prenom Nom
## 1 1 John Doe
## 2 2 Peter Gynn
## 3 3 Jolie Hope
## 4 4 John snow
1.9.6 Combiner
# par les colonnes
# les data frames doivent avoir le même nombre de lignes :
cbind(mon_tab_1,mon_tab_2)## ID Prenom ID Nom
## 1 1 John 1 Doe
## 2 2 Peter 2 Gynn
## 3 3 Jolie 3 Hope
## 4 4 John 4 snow
# Par les lignes
# les data frames doivent avoir les mêmes colonnes (nom identiques) :
colnames(mon_tab_1) <- colnames(mon_tab_2)
rbind(mon_tab_1,mon_tab_2)## ID Nom
## 1 1 John
## 2 2 Peter
## 3 3 Jolie
## 4 4 John
## 5 1 Doe
## 6 2 Gynn
## 7 3 Hope
## 8 4 snow
1.9.7 Regroupement
Ci-dessous, deux solutions de regroupement possibles, avec opération sur une variable :
# METHODE 1 -> Fonction primitive aggregate(), fonction applicable sur une seule variable
# Regroupement des lignes en fonction des valeurs des variables disp et cyl
# + somme des valeurs de la variable vs
aggregate(data = mtcars, disp ~ cyl + vs, sum)## cyl vs disp
## 1 4 0 120.3
## 2 6 0 465.0
## 3 8 0 4943.4
## 4 4 1 1036.2
## 5 6 1 818.2
# METHODE 2 -> Utilisation du package dplyr
# + calcul d'une somme, d'une moyenne et d'un nombre de ligne pour des valeurs regroupées
library(dplyr)
mtcars %>%
group_by(cyl, vs) %>%
summarise(sum_disp=sum(disp), moy_hp=mean(hp), nb_element=length(cyl) )## # A tibble: 5 x 5
## # Groups: cyl [3]
## cyl vs sum_disp moy_hp nb_element
## <dbl> <dbl> <dbl> <dbl> <int>
## 1 4 0 120. 91 1
## 2 4 1 1036. 81.8 10
## 3 6 0 465 132. 3
## 4 6 1 818. 115. 4
## 5 8 0 4943. 209. 14
1.9.8 Manipulation de data frame
# Construction data frame
mydata <- data.frame(id=c(1,1,2,2),
time=c(1,2,1,2),
x1=c(5,3,6,2),
x2=c(6,5,1,4))
mydata## id time x1 x2
## 1 1 1 5 6
## 2 1 2 3 5
## 3 2 1 6 1
## 4 2 2 2 4
## [,1] [,2] [,3] [,4]
## id 1 1 2 2
## time 1 2 1 2
## x1 5 3 6 2
## x2 6 5 1 4
Le package reshape2 contient plusieurs fonctions de remodelage de data frame :
## id time variable value
## 1 1 1 x1 5
## 2 1 2 x1 3
## 3 2 1 x1 6
## 4 2 2 x1 2
## 5 1 1 x2 6
## 6 1 2 x2 5
## 7 2 1 x2 1
## 8 2 2 x2 4
# fonction dcast(data, formula, function) - s'applique sur des 'melted data'
mydata_melt_cast <- dcast(mydata_melt, id~variable, mean)
mydata_melt_cast ## id x1 x2
## 1 1 4 5.5
## 2 2 4 2.5
Il est aussi possible d’utiliser des fonctions du package tidyr, developpé par Rstudio.
1.9.9 Trier des données
## [1] 1 2 3 4 5 6 7 9
# Fonction order()
order_mtcars <- mtcars[order(mtcars$cyl, -mtcars$disp, mtcars$carb, decreasing = TRUE), ]
head(order_mtcars)## mpg cyl disp hp drat wt qsec vs am gear carb
## Merc 450SE 16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3
## Merc 450SL 17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3
## Merc 450SLC 15.2 8 275.8 180 3.07 3.780 18.00 0 0 3 3
## Maserati Bora 15.0 8 301.0 335 3.54 3.570 14.60 0 1 5 8
## AMC Javelin 15.2 8 304.0 150 3.15 3.435 17.30 0 0 3 2
## Dodge Challenger 15.5 8 318.0 150 2.76 3.520 16.87 0 0 3 2
1.9.10 Boucle itérative
Une boucle est une série d’instructions exécutées jusqu’à ce qu’un résultat particulier soit obtenu ou qu’une condition pré-déterminée soit remplie. Les boucles permettent de ré-utiliser des séries d’instructions et permettent ainsi de limiter le nombre d’instructions.
## [1] "Passage n°1"
## [1] "Passage n°2"
## [1] "Passage n°3"
## [1] "Passage n°4"
## [1] "Passage n°5"
1.9.11 Fonctions apply
L’utilisation d’une boucle est très fréquente en traitement de données. Une boucle peut permettre d’effectuer des traitements sur des objets de structure multidimensionnelle (data frame, matrice, array, sf…). Mais pour cela, la boucle for n’est pas la technique otpimum. Les concepteurs de R ont développé des fonctions spécialement prévu à cet effet.
## Mazda RX4 Mazda RX4 Wag Datsun 710 Hornet 4 Drive
## 29.90727 29.98136 23.59818 38.73955
## Hornet Sportabout Valiant Duster 360 Merc 240D
## 53.66455 35.04909 59.72000 24.63455
## Merc 230 Merc 280 Merc 280C Merc 450SE
## 27.23364 31.86000 31.78727 46.43091
## Merc 450SL Merc 450SLC Cadillac Fleetwood Lincoln Continental
## 46.50000 46.35000 66.23273 66.05855
## Chrysler Imperial Fiat 128 Honda Civic Toyota Corolla
## 65.97227 19.44091 17.74227 18.81409
## Toyota Corona Dodge Challenger AMC Javelin Camaro Z28
## 24.88864 47.24091 46.00773 58.75273
## Pontiac Firebird Fiat X1-9 Porsche 914-2 Lotus Europa
## 57.37955 18.92864 24.77909 24.88027
## Ford Pantera L Ferrari Dino Maserati Bora Volvo 142E
## 60.97182 34.50818 63.15545 26.26273
## mpg cyl disp hp drat wt qsec vs
## 642.900 198.000 7383.100 4694.000 115.090 102.952 571.160 14.000
## am gear carb
## 13.000 118.000 90.000
## [1] 0.210 0.210 0.228 0.214 0.187 0.181 0.143 0.244 0.228 0.192 0.178 0.164
## [13] 0.173 0.152 0.104 0.104 0.147 0.324 0.304 0.339 0.215 0.155 0.152 0.133
## [25] 0.192 0.273 0.260 0.304 0.158 0.197 0.150 0.214
# Appliquer une fonction sur chaque items (sortie list)
Resultat_lapply <- lapply(mtcars$mpg, function(x) x/100)
Resultat_lapply[1:5]## [[1]]
## [1] 0.21
##
## [[2]]
## [1] 0.21
##
## [[3]]
## [1] 0.228
##
## [[4]]
## [1] 0.214
##
## [[5]]
## [1] 0.187
1.9.12 Test conditionnel
Un test conditionnel permet d’exécuter une portion de code ou non en fonction du résultat de variables booléennes.
# Test simple
if (condition){action}
# Test avec deux solutions
if (condition){
action1
} else {
action2
}# Exemple
x <- "chaîneDeCaractères"
x <- TRUE
x <- 12
if (is.character(x)){
print("x est une chaîne de caractères")
} else {
if (is.numeric(x)) {
print("x est numéric")
} else {
print("x est bizarre !")
}
}## [1] "x est numéric"
1.9.13 Gestion de chaîne de caractères
Il existe de nombreuses fonctions primitives pour gérer les chaînes de caractère. Quelques exemples :
## [1] "Champions du monde"
## [1] "Championsdumonde"
# Gérer la casse
text <- "champion Du MONDEEEEEE !"
# tout en minuscule
tolower(text)
# tout en majuscule
toupper(text)# Scinder une chaîne en fonction d'un caractère
strsplit(text, split = " ", fixed = TRUE)
# Remplacer un (ou plusieurs) caractère(s) par un autre
gsub("ion", "ionne", text)Si vous souhaitez réaliser des traitements complexes sur des chaînes de caractère, vous pouvez utilisez la librairie de référence stringr vous permettra de réaliser toutes les opérations les plus complexes. Quelques exemples :
# Librairie de référence pour le gestion de chaîne de caractère
library(stringr)
# Détécter la présence d'un caractère ou d'une chaîne
str_detect(text, "E")
# Position de la première occurrence d'un caractère ou d'une chaîne
str_locate(text, "pi")
# Toutes les positions d'un caractère ou d'une chaîne
str_locate_all(text, "E")
# Extraire un segment de chaîne de caractère
str_sub(text, 5, 9)
# Suppression des espaces en début et fin de chaîne de caractère
str_trim(" abc ")Il est possible de combiner l’utilisation des expressions régulières avec toutes ces fonctions.
Les expressions régulières, ou plus communément regex (contraction de regular expression) permettent de représenter des modèles de chaînes de caractère. Ce sont des outils très puissants et très utilisés : on peut les retrouver dans de nombreux langages comme le PHP, MySQL, Javascript… Si cet outil est très puissant, il est relativement difficile à appréhender au début car les expressions régulières peuvent prendre des formes complexe à interpreter. Ex :
# EXEMPLE d'utilisation d'expression régulière (regex)
# Création d'une vecteur d'adresse mail
# Avec des adresses mail, parfois mal orthographiées
emails_list <- c("hugues.pecout@cnrs.fr",
"hugues@gmail",
"blabla.com",
"hugues.pecout@gis-cist.fr",
"timothée.giraud@cnrs.fr")
# Expression regex qui répond aux adresses email
regex <- "\\<[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}\\>"
# Détection des emails corrects présentes dans ma liste d'email
grep(regex, emails_list, ignore.case=TRUE)## [1] 1 4 5
1.9.14 Répresentations graphiques
Réaliser des graphiques en utilisant des fonctions primitives :
# Exemple
hist(mtcars$mpg,
breaks=12,
col="red",
xlab= "mpg",
ylab = "Fréquence",
main = "Distribution de la série statistique 'mpg'")Toute une série d’arguments permet d’ajuster les représentations, ex :
axes : Afficher ou non les axes (TRUE ou FALSE)
log : Mettre les axes à l’echelle logarithmique (“x”, “y”, “xy”)
type : Argument qui contrôle le type d’axe produit (“p”= points, “l” = ligne, “o” = point relier par ligne…)
…
Plusieurs éléments peuvent être superposés aux graphiques (en utilisant l’argument add =TRUE), ex :
text() : Ajouter du texte
legend() : Ajouter un légende
abline() : Ajouter une ligne
axis() : Ajouter un axe
…
Il est possible d’afficher plusieurs graphiques en même temps, à l’aide des fonctions par() ou layout(). Ex :
# Division de la fenêtre graphique en 2 lignes et 2 colonnes
par(mfrow=c(2,2))
# Création de 4 différents graphiques
plot(mtcars$wt, mtcars$mpg, main="Graph 1")
plot(mtcars$wt, mtcars$disp, main="Graph 2")
hist(mtcars$wt, main="Graph 3")
boxplot(mtcars$wt, main="Graph 4")Pour réaliser des graphiques plus spécifiques (et plus beau !), utilisez la librarie de référence ggplot2. Ex :
library(ggplot2)
# Exemple : Density plots
g <- ggplot(mpg, aes(cty))
g + geom_density(aes(fill=factor(cyl)), alpha=0.8) +
labs(title="Density plot",
subtitle="City Mileage Grouped by Number of cylinders",
caption="Source: data R mtcars",
x="City Mileage",
fill="# Cylinders")1.10 > Exercice
Créez un nouveau projet à l’emplacement de votre choix.
Récupérez les données.
Source : INSEE - Recensement de population & IGN, BD ADMIN EXPRESS
- Chargez le fichier INSEE_COM_972.csv dans un objet.
# Fonctions possibles
read.csv()
read.table()
# Quelques arguments utiles...
header=TRUE
sep=";"
stringsAsFactors=FALSE- Visualisez et interrogez votre objet data frame, en ligne de code ET depuis l’interface RStudio.
# Fonctions possibles :
View()
head()
dim()
str()
summary()
class()
colnames()
# Depuis l'interface : onglet 'Environnement' (en haut à droite)
# Puis cliquer sur l'objet souhaité- Corrigez la classe de données de certaines variables
# Convertissez 'CODGEO, 'DEP', 'REG', 'CATAEU2010' en caractère
# Convertissez les variables stockées en facteur en caractére
as.character()- Séléctionnez les communes isolées hors influence des pôles (CATAEU2010 == 400) de plus de 2000 habitants en 2016 (P16_POP).
- Créez une nouvelle variable contenant la part de la population agée de 0 à 14 ans en 2016 (P16_POP0014 / P16_POP * 100)
- Chargez la couche géographique martinique.shp dans un objet.
- Réalisez une jointure entre la couche géographique et votre tableau de données
Puis, appliquez la fonction plot() au résultat…
1.10.1 Bonus
- Installez le package Rcade développé par Romain Lesur.
Ce package se trouve-t-il sur le CRAN ? Où se trouve-t-il et pourquoi ?
- Installez le package
Essayer-le… pas plus de 2-3 minutes :-) )
- Supprimez le package
2 Statistique univariée
2.1 Vocabulaire
Statistique descriptive
Tout nombre, calculé à propos d’une population et qui contribue à décrire un aspect de cette population, est une statistique. Fréquences, médianes, quartiles, déciles, moyennes, variances, etc. sont des statistiques.
La statistique descriptive regroupe l’ensemble des techniques pour décrire numériquement une distribution.
Population (p) et Individu (i)
Une population est un ensemble d’individus (ou unités statistiques) sur lesquels porte l’étude statistique.
Effectif (N ou n)
Nombre d’individus d’une population(N) ou d’une partie quelconque de cette population(n).
\[N=\sum_{} i\]
Variable (x) ou caractère
Une variable est une information dont on recueille (ou observe ou mesure) la valeur sur chaque individu. On parle de variable parce que la valeur de l’information n’est pas la même d’un individu à l’autre. Une variable est quantitative (valeur numérique) ou qualitative :
Une variable est quantitative si elle est mesurable. Ex : Un temps.
Elle est discrète si elle ne prend que des valeurs isolées. Ex : un âge.
Elle est continue si elle peut prendre toutes les valeurs comprises entre 2 nombres. Ex : une distance.
Si une variable n’est pas mesurable, elle est dite qualitative. Ex: Une couleur.
Elle est ordinale si on peut comparer/trier les modalités entre elles. Ex : Une appréciation.
Elle est binaire si elle n’est composé que de deux modalités. Ex : oui/non.
Elle est dite nominale dans les autres cas. Ex : Une forme.
Distribution
La distribution des individus selon une (ou deux) variables, est la répartition de l’effectif(n) des individus(i) par valeur ou classe de valeur.
Figure : Les différents éléments d’une population
Fréquence (f) ou proportion
Rapport entre un effectif(n) particulier d’individus et l’effectif total(N).
\[f(n)=\frac{n}{N}\]
Moyenne
Valeur uniforme que devrait présenter chaque individu d’un ensemble (population ou échantillon) pour que le total de l’ensemble soit inchangé.
\[\bar{x}=\frac{\sum{xi}}{N}\]
Mode
le mode (ou valeur dominante) est la valeur la plus représentée d’une variable quelconque dans une population donnée. Une répartition peut être unimodale ou plurimodale (bimodale, trimodale…) si deux ou plusieurs valeurs de la variable considérée émergent également. Une distribution sans aucun mode est appelée distribution uniforme.
Médiane, quartiles, déciles et centiles
Ces valeurs correspondent respectivement à une proportion de l’effectif des individus rangés par valeurs croissantes.
Médiane : valeur qui divise la série statistique en deux (50 %)
Quartiles : valeurs qui divisent la série statistique en quatre (Q1=25%, Q2=50%, Q3=75%)
Décile : valeurs qui divisent la série statistique en dix (10% à 90%)
Centiles : valeurs qui divisent la série statistique en cent (1% à 99%)
Intervalle interquartile
Basé sur les quantiles, l’intervalle interquartile (Q3-Q1) est un paramètre de dispersion absolue qui correspond à l’étendue d’une distribution une fois que l’on a retiré les 25% des valeurs les plus faibles et les 25% des valeurs les plus fortes.
Ecart absolu moyen
Moyenne de la valeur absolue des écarts à la moyenne. Autrement dit, c’est la distance moyenne à la moyenne.
Ecart absolu médian
Moyenne des écarts à la médiane.
Variance(σ2) et écart-type(σ)
Indicateurs de la dispersion des valeurs des individus autour de la moyenne. La variance est la moyenne des carrés des écarts à la moyenne. L’écart-type est sa racine carrée. Ce sont des paramètres de dispersion.
\[\sigma^x = \sqrt{ \frac{\sum_{i=1}^{n}(x_i - \mu)^2} {n}} \]
Coefficient de variation
Le coefficient de variation (CV) est le rapport de l’écart-type à la moyenne. Le coefficient de variation, également nommé écart type relatif, est une mesure de dispersion relative. Plus la valeur du coefficient de variation est élevée, plus la dispersion autour de la moyenne est grande. Il est généralement exprimé en pourcentage. Sans unité, il permet la comparaison de distributions de valeurs dont les échelles de mesure ne sont pas comparables.
\[CV = \frac{\sigma }{\mu } \]
Amplitude
Longueur de l’intervalle entre la valeur minimum et maximum.
Discrétiser une distribution
Discretiser revient à rendre discret des valeurs continues. Cela consiste à classer les valeurs quantitatives d’une série statistique par intervalle de valeur selon des critères justifiables afin d’en améliorer la lecture.
L’ensemble des classes (intervalles de valeurs) créé forme ainsi une partition de toutes les valeurs possibles de la variable.
Exemple :Il est par exemple possible de discrétiser les valeurs d’un variable s’échalonnant de 1 à 25, en construisant les classes suivantes : [min à 5] - [6 à 10] - [11 à 15] - [16 à 20] - [21 à max]
Normaliser une distribution
La normalisation d’une (ou plusieurs) série(s) de données est nécessaire quand l’incompatibilité des unités de mesures entre les variables peut affecter les résultats sans apporter d’interprétations claires. Elle permet d’ajuster une série (vecteur) de valeurs suivant une fonction de transformation pour les rendre comparables avec quelques points de référence spécifiques.
Deux exemple de normalisation :
- Transformation en pourcentage (en ligne, en colonne ou les deux):
- Standardisation (centrer-réduire):
Il s’agit d’un centrage par rapport à la moyenne puis d’une réduction par rapport à l’écart-type :
\[Y_{i} =\frac{X_{i} - \bar{x}}{\sigma^x }\]
2.2 Résumer une variable
Avant de résumer une ou plusieurs variables statistiques, il est important d’explorer et de visualiser les données. Cela permet de détécter les caractèristiques des données étudiées, et de les traiter correctement.
Comment se structure la table de données ? Est-elle correctement construite et renseignée ?
Comment sont nommées les individus et les variables ?
Quelle est la classe de données des différentes variables (numérique, chaîne de caractère, booléenne…) ?
Quelles sont les types des variables stockées (quantitative, qualitative…) ?
# Vous pouvez utiliser le jeu de donnée exemple "hdv2003" du package questionr
library(questionr)
data(hdv2003)
# 1) Utilisation de l'interface RStudio
# 2) ET Fonctions possibles (cf. 1.5 'Interroger un obet')
View()
str()
colnames()
names()
row.names()
dim()
class()
is.na()
colSums(is.na())2.2.1 La distribution
Lorsque l’on étudie une variable, Il est important de s’intérresser à la distribution de sa série statistique. Pour cela, il est necessaire de calculer la table de fréquence, qui s’effectue différement selon le type de variable :
2.2.1.1 Variable qualitative : fréquence des individus par modalités.
# Jeu de données exemple :
library(questionr)
data(hdv2003)
# Effectifs par modalité -> table()
table(hdv2003$occup)##
## Exerce une profession Chomeur Etudiant, eleve
## 1049 134 94
## Retraite Retire des affaires Au foyer
## 392 77 171
## Autre inactif
## 83
##
## Exerce une profession Chomeur Etudiant, eleve
## 0.5245 0.0670 0.0470
## Retraite Retire des affaires Au foyer
## 0.1960 0.0385 0.0855
## Autre inactif
## 0.0415
# Réprésenter sur un diagramme circulaire -> pie ()
# Réprésenter sur un diagramme -> barplot()
library("RColorBrewer")
barplot(table(hdv2003$occup), col=brewer.pal(n = 9, "Paired"), las=2 ,cex.names=0.6)Pour une variable qualitative ordinale, il est également possible de calculer la fréquence cumulée (cf. ci dessous).
2.2.1.2 Variable quantitative: fréquence des individus par classe.
Pour faciliter l’interpretation de la fréquence d’une variable quantitative, il est souvent nécessaire de discrétiser la série statistique en plusieurs classes d’amplitude égale, car (en général) aucune valeur n’est identique.
Il est trés simple de réaliser l’histogramme d’une distribution discrétisée en plusieurs classes d’amplitude égale avec la fonction hist().
# Vous pouvez utiliser le jeu de donnée exemple "mtcars"
data(mtcars)
# Pour représenter la distribution d'une série statistique sans la discrétiser préalablement -> hist()
hist(mtcars$mpg, breaks=12, probability = TRUE)2.2.2 Les valeurs centrales
Pour les variables quantitatives, des résumés numériques (valeurs centrales, paramètres de dispersion absolue et relative) peuvent être calculés.Le mode peut être également calculé pour les variables qualitatives ordinales et nominales, et la médianne peut être calculé pour les variables qualitatives ordinales.
## [1] 146.6875
## [1] 123
# Mode = Valeurs qui a la fréquence la plus élévée
result <- as.data.frame(table(mtcars$hp))
# Trier les valeurs par leur fréquence -> order()
result[order(result$Freq, decreasing = TRUE),]## Var1 Freq
## 11 110 3
## 15 175 3
## 16 180 3
## 4 66 2
## 13 123 2
## 14 150 2
## 20 245 2
## 1 52 1
## 2 62 1
## 3 65 1
## 5 91 1
## 6 93 1
## 7 95 1
## 8 97 1
## 9 105 1
## 10 109 1
## 12 113 1
## 17 205 1
## 18 215 1
## 19 230 1
## 21 264 1
## 22 335 1
2.2.3 Les paramètres de dispersions absolue
Les paramètres de dispersion absolue se calculent uniquement sur les variables quantitatives.
## [1] 52
## [1] 335
## [1] 283
## 0% 25% 50% 75% 100%
## 52.0 96.5 123.0 180.0 335.0
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 52.0 96.5 123.0 146.7 180.0 335.0
## 3rd Qu.
## 83.5
## [1] 4700.867
## [1] 68.56287
## [1] 46.74077
2.3 Discrétiser une variable
Pour réaliser une discétisation correcte, il est necéssaire de définir la forme de la distribution à discrétiser.
Ci-dessous, quelques formes classiques de distribution statistique :
En fonction du profil d’une distribution, on utilise différentes méthodes de discrétisation :
Amplitude égale
Toutes les classes ont la même amplitude.A privilégier pour les distributions uniformes ou symétriques.
Discrétisation standardisée
Les classes sont déterminées selon une fraction d’écart-type par rapport à la moyenne.A privilégier pour les distributions symétriques.
Par seuil observé
Les bornes sont crées par observation de la distribution, de manière manuelle.A privilégier pour les distributions dissymétriques et/ou bimodales.
Effectifs égaux (quantiles)
Les bornes sont construites en réalisant des classes d’effectifs égaux.A privilégier pour les distributions dissymétriques et/ou bimodales.
Q6
Variante de la discrétisation selon les quantiles avec isolement des classes extrêmes de la série.A privilégier pour les distributions dissymétriques et/ou bimodales.
Fisher-Jenks
Les classes construites maximisent la variance inter-classe et minimisent la variance intra-classe.A privilégier pour les distributions dissymétriques et/ou bimodales.
Progression géométrique
Les classes sont découpées selon une progression géométrique.A privilégier pour les distributions dissymétriques.
Progression arithmétique
Les classes sont établies selon une progression arithmétique.A privilégier pour les distributions dissymétriques.
Le choix d’un méthode de discrétisation et du nombre de classes à un impact trés important sur l’interprétation de sa représentation visuelle. Cette application, proposée par Laurent Jégou (2017) en est une belle demonstration.
Exemple pratique de discrétisation d’une variable :
# Chargement des données
POP16_mtq <- read.csv("data/INSEE_COM_972.csv")
# Calcul d'un ratio, qui sera la variable quantitative continue à discrétiser
POP16_mtq$TX_0014 <- 100 * POP16_mtq$P16_POP0014/POP16_mtq$P16_POPPour discrétiser les valeurs de cette série statistique, utilisez la fonction getBreaks() du package cartography :
# Construction d'un vecteur avec les bornes de chaque classe - getBreaks() / library(cartography)
# method :
# Amplitude égale = "equal"
# Discrétisation standardisée = "sd"
# Effectifs égaux = "quantile"
# Q6 = "q6"
# Fisher-Jenks = "fisher-jenks"
# Progression géométrique = "geom"
# Progression arithmétique = "arith"
# ?? = "em"
# ?? = "msd"
# my_discretisation <- c(1.00, 60.00, 190.00, 368.25, 697.50, 930.00, 1168.50, 1842.00, 8027.00)
# OU -
library(cartography)
my_discretisation <- getBreaks(POP16_mtq$TX_0014 , nclass = NULL, method = "quantile", k = 1, middle = FALSE)
my_discretisation## [1] 10.51248 14.71700 15.71208 16.93112 17.95490 18.78466 20.70616
# Afficher votre discrétisation sur l'histogramme de la distribution
hist(POP16_mtq$TX_0014, breaks=20, col="grey", main= "Distribution de la variable")
abline(v=mean(POP16_mtq$TX_0014), col="red", lwd=1 , lty=2,add=T)
abline(v=my_discretisation,col="blue", lwd=2, lty=2)
legend("topright", c("moyenne", "borne de classe"), fill=c(col="red", col="blue"), cex=0.8)# Pour enregistrer l'appartenance de classe dans votre objet (sf ou data frame par ex) -> cut()
POP16_mtq$CLASS_TX_0014 <- cut(POP16_mtq$TX_0014, my_discretisation, include.lowest = TRUE, right = TRUE)
# Visualiser le nombre d'éléments par classe
table(POP16_mtq$CLASS_TX_0014)##
## [10.5,14.7] (14.7,15.7] (15.7,16.9] (16.9,18] (18,18.8] (18.8,20.7]
## 6 6 5 6 5 6
2.4 Représentation graphique
- L’histogramme
# Sous forme d'histogramme
hist(mtcars$qsec, breaks=10, col="grey", Freq=FALSE, main= "Distribution variable quantitative continue 'qsec'")
abline(v=mean(mtcars$qsec), col="red4", lwd=2 , lty=1,add=T)
abline(v=quantile(mtcars$qsec),col="red", lwd=1, lty=2)
legend("topright", c("moyenne", "Quartiles"), fill=c(col="red4", col="red"), cex=0.8)
rug(mtcars$qsec, col="blue")- La boite à moustaches (boxplot) :
# Boite à moustache
boxplot(mtcars$qsec,
main = "Distribution variable quantitative continue 'qsec'",
xlab = "qsec",
col = "orange",
border = "brown",
horizontal = TRUE)
# ajouter la série statistique en bas du boxplot
rug(mtcars$qsec)- La carte
En fonction de la nature des variables à représenter, on ne doit pas utiliser les mêmes méthodes de représentation. Cependant, pour réaliser toute sortes de cartes statistiques, vous pouvez n’utiliser qu’un seul package : ‘cartography’
Source : https://www.rdocumentation.org/packages/cartography/versions/2.1.1
# Jointure avec un tableau de données :
mtq <- merge(mtq, POP16_mtq, by.x="INSEE_COM", by.y="CODGEO")
# création d'une palette de couleur en N classe
cols <- carto.pal(pal1 = "wine.pal", n1 = 6)
# gestion des marges
opar <- par(mar = c(0,0,1.2,0))
# Affichage communnes de la Martinique
plot(st_geometry(mtq), col = "#5F799C", border = "white",
bg = "#A6CAE0", lwd = 0.5, add = FALSE)
library(cartography)
# Affichage cercles proportionnels + choroplète
propSymbolsChoroLayer(x = mtq, # sf object
var = "P16_POP", # field used to plot the symbols sizes
var2 = "TX_0014", # field used to plot the colors
col = cols, # symbols colors
inches = 0.3, # radius of the largest circle
method = "quantile", # discretization method (?getBreaks)
border = "grey50", # color of circle borders
lwd = 1, # width of the circle borders
legend.var.pos = "topright", # position of the first legend
legend.var2.pos = "left", # position of the second legend
legend.var2.title.txt =
"Share of the\nyoung population\n(0 to 14 years old) (%)",
legend.var.title.txt = "Total population",
legend.var.style = "c") # legend style2.5 > Exercice
Créez un projet (ou réutilisez le projet créé durant l’exercice 1).
Charger de nouveau le fichier INSEE_COM_972.csv, stocké dans le repertoire de votre projet.
Séléctionnez uniquement ces variables et créez un nouveau data frame.
Code insee de la commune (CODGEO)
Nom de la commune (LIBGEO)
Libellé aire urbaine (LIBAU2010)
Catégorie commune dans aire urbaine (CATAEU2010)
Population total en 2016 (P16_POP)
Nombre de personnes de 15 ans et plus en 2016 (C16_POP15P)
Nombre d’agriculteurs et exploitants de 15 ans et plus (C16_POP15P_CS1)
Nombre de retraités de 15 ans et plus (C16_POP15P_CS7)
Les valeurs de ces variables sont-elles correctement stockées (Numerique ? caractère ? …)
- Créez une nouvelle variable avec la part de la population d’agriculteurs et exploitants dans la population active. Nommée cette nouvelle variable : TX_CS1_2016
Quel est le taux minimum ?
Quel est le taux maximum ?
Quel est l’amplitude de la variable ?
Quelle est la moyenne ? Quelle indicateur divise la série statistique en deux ? Quelle est sa valeur ?
Quel est son écart-type, son intervalle interquartile ?
Comment résumer la distribution de cette variable par un graphique ? (plusieurs solutions sont possibles)
- Discrétisez la variable TX_CS1_2016
- Créez une variable qualitative à partir des valeurs de la variable TX_CS1_2016
# Si TX_CS1_2016 < ..., alors CAT_CS1_2016 == "FAIBLE"
# Si TX_CS1_2016 < ... & > ... , alors CAT_CS1_2016 == "MOYEN"
# Si TX_CS1_2016 > ... , alors CAT_CS1_2016 == "FORT"
# Utilisez la fonction
cut() - Joingnez le tableau à la couche géographique de la Martinique.
- Cartographiez la part d’agriculteurs et exploitant dans la population active.
3 Statistique bivariée
3.1 Vocabulaire
Statistique bivariée
C’est l’étude des relations entre deux variables, quantitatives et/ou qualitatives. Les analyses bivariées consistent ainsi à étudier des variables prises en couple, via des techniques descriptives ou probabilistes. L’objectif est de mettre en évidence un lien ou une absence de lien entre 2 variables, et d’étudier ce lien (sens, intensité) lorsqu’il existe.
L’analyse d’une relation bivariée avec deux types de variables possibles se résume à trois cas :
1- Relation entre deux variables qualitatives (3.2)
2- Relation entre une variable qualitative et une variable quantitative (3.3)
3- Relation entre deux variables quantitatives (3.4)
Test statistique
Un test statistique est une procédure de décision entre deux hypothèses. Il s’agit d’une démarche consistant à rejeter ou à ne pas rejeter une hypothèse statistique, appelée hypothèse nulle, en fonction d’un jeu de données (échantillon).
Corrélation
Mesure du lien d’association entre des phénomènes (variables) décrits par des séries statistiques. Le calcul d’une corrélation entre deux variables permet de savoir si elles sont liées.
Tableau de contigence (tableau croisé)
Pour déterminer s’il existe une relation entre deux variables étudiés, on construit un tableau de contingence.Les valeurs du tableau correspondent aux effectifs de population selon les modalités des deux variables. Ex :
La construction d’un tableau de contingence est la première étape nécessaire pour évaluer la dépendance de deux variables qualitatives
Résidu
Les résidus d’une regression expriment l’écart entre les valeurs observées et les valeurs prédites par le modèle. Plus un individu aura des résidus fort (positifs ou négatif), moins sa position sera expliquée par le modèle. Il faudra alors trouver d’autres facteurs explicatifs.
3.2 Deux variables qualitatives
Un couple de variables qualitatives se décrit par ses fréquences conjointes dans un tableau tris croisés . Les fréquences obtenues peuvent être calculées par rapport à l’effectif total ou par rapport aux effectifs marginaux (effectif en ligne et colonne). Il s’agit de l’une des analyses les plus fréquentes lors du traitement d’enquêtes en sciences sociales.
3.2.1 Tableaux croisés
La manière la plus simple d’obtenir un tableau croisé est d’utiliser la fonction **table().
## id age sexe nivetud poids
## 1 1 28 Femme Enseignement superieur y compris technique superieur 2634.398
## 2 2 23 Femme <NA> 9738.396
## 3 3 59 Homme Derniere annee d'etudes primaires 3994.102
## occup qualif freres.soeurs clso
## 1 Exerce une profession Employe 8 Oui
## 2 Etudiant, eleve <NA> 2 Oui
## 3 Exerce une profession Technicien 2 Non
## relig trav.imp trav.satisf
## 1 Ni croyance ni appartenance Peu important Insatisfaction
## 2 Ni croyance ni appartenance <NA> <NA>
## 3 Ni croyance ni appartenance Aussi important que le reste Equilibre
## hard.rock lecture.bd peche.chasse cuisine bricol cinema sport heures.tv
## 1 Non Non Non Oui Non Non Non 0
## 2 Non Non Non Non Non Oui Oui 1
## 3 Non Non Non Non Non Non Oui 0
##
## Ouvrier specialise Ouvrier qualifie Technicien Profession intermediaire
## Non 166 215 44 83
## Oui 37 77 42 77
##
## Cadre Employe Autre
## Non 117 401 38
## Oui 143 193 20
Il est cependant difficile de comparer à partir des effectifs. Le package questionr()** fournit des fonctions permettant de calculer facilement les pourcentages lignes, colonnes et totaux d’un tableau croisé. Les pourcentages en lignes ou en colonne s’obtiennent avec les fonctions lprop()** et cprop(). Celles-ci s’appliquent au tableau croisé généré par table() :
# Pourcentage en ligne d'un tableau croisé table(), avec lprop() du package 'questionnr'
lprop(table(hdv2003$sport, hdv2003$cuisine))##
## Non Oui Total
## Non 59.4 40.6 100.0
## Oui 49.8 50.2 100.0
## Ensemble 56.0 44.0 100.0
# Pourcentage en colonne d'un tableau croisé table(), avec cprop() du package 'questionnr'
cprop(table(hdv2003$sport, hdv2003$cuisine))##
## Non Oui Ensemble
## Non 67.8 58.8 63.8
## Oui 32.2 41.2 36.1
## Total 100.0 100.0 100.0
Les pourcentages totaux s’obtiennent avec la fonction prop()
# Pourcentages totaux d'un tableau croisé
prop(table(hdv2003$sport, hdv2003$cuisine),
digit=2,
percent=TRUE)##
## Non Oui Total
## Non 37.95% 25.90% 63.85%
## Oui 18.00% 18.15% 36.15%
## Total 55.95% 44.05% 100.00%
3.2.2 Le khi2 et la mesure des écarts à l’indépendance
A partir d’un tableau croisée, on peut tester l’existence d’un lien entre les modalités de deux variables avec le test du Khi-2 :
Cela consiste à comparer la répartition observée à une répartition théorique sous hypothèse d’indépendance, c’est-à-dire la répartition qu’on observerait s’il n’y avait aucun lien entre les deux variables. Cette répartition théorique consiste donc à redistribuer les effectifs conjoints tout en conservant les effectifs marginaux.
Le test du khi-2 permet d’établir à quel seuil de probabilité on peut rejeter l’hypothèse d’indépendance entre des effectifs observés et des effectifs théoriques. Plus le khi-2 est proche de zéro, plus le tableau des effectifs théoriques et celui des effectifs observées se confondent.
Un test de khi-2 s’applique uniquement sur des tableaux de contingence :
- ayant au moins 2 lignes et 2 colonnes
- contenant des valeurs positives entières
- ayant au minimum 5 observations par cases du tableau et/ou dans le tableau des effectifs théoriques.
Lorsque toutes les cases du tableau n’ont pas plus de 5 observations par cases, il est conseillé d’effectuer des regroupement de modalités lorsque c’est possible.
L’objet créé par la fonction chisq.test() est une liste qui contient tous les éléments nécessaires à l’analyse du khi-2 : effectifs théoriques, résidus bruts ou résidus relatifs :
##
## Pearson's Chi-squared test
##
## data: tab
## X-squared = 100.27, df = 6, p-value < 2.2e-16
Le test nous donne la statistique du χ2(chi-squared), le degré de liberté associé au test (le produit du nombre de modalités) et la significativité de la relation (valeur p).
La probabilité d’obtenir une valeur du Khi-2 observée aussi élevée dans un échantillon de la taille observée sous l’hypothèse d’indépendance des deux variables est inférieure à 0.001%. Il est donc possible de rejeter l’hypothèse d’indépendance. Il semble bien exister une relation entre la csp et la pratique du sport.
##
## Ouvrier specialise Ouvrier qualifie Technicien Profession intermediaire
## Non 166 215 44 83
## Oui 37 77 42 77
##
## Cadre Employe Autre
## Non 117 401 38
## Oui 143 193 20
##
## Ouvrier specialise Ouvrier qualifie Technicien Profession intermediaire
## Non 130.66667 187.954 55.35632 102.98851
## Oui 72.33333 104.046 30.64368 57.01149
##
## Cadre Employe Autre
## Non 167.35632 382.3448 37.33333
## Oui 92.64368 211.6552 20.66667
##
## Ouvrier specialise Ouvrier qualifie Technicien Profession intermediaire
## Non 3.0910228 1.9727718 -1.5263498 -1.9696359
## Oui -4.1544675 -2.6514902 2.0514798 2.6472754
##
## Cadre Employe Autre
## Non -3.8925387 0.9540511 0.1091089
## Oui 5.2317394 -1.2822858 -0.1466471
Il est possible d’affiner l’interprétation du test en déterminant dans quelle case l’écart à l’indépendance est le plus significatif en utilisant les résidus du test. Ceux-ci sont notamment affichables avec la fonction chisq.residuals() de la librairie ‘questionr’ :
##
## Ouvrier specialise Ouvrier qualifie Technicien Profession intermediaire
## Non 3.09 1.97 -1.53 -1.97
## Oui -4.15 -2.65 2.05 2.65
##
## Cadre Employe Autre
## Non -3.89 0.95 0.11
## Oui 5.23 -1.28 -0.15
3.2.3 Représentations graphiques
tab <- table(hdv2003$sport, hdv2003$qualif)
# Diagramme en bâton
barplot(cprop(tab, total = FALSE), main = "Pratique du sport selon le niveau de qualification",las=2)
legend("topright", c("NON", "OUI"), fill=c(col="grey40", col="grey90"), cex=0.8)# Fonction mosaicplot()
mosaicplot(qualif ~ sport, data = hdv2003, shade = TRUE, main = "Graphe en mosaïque", cex=0.6)La fonction mosaicplot() permet représentation graphique du tableau de contingence assez efficace : la longueur des segments sur les deux axes correspond aux fréquences relatives correspondantes et l’aire des rectangles est également proportionnelle à la fréquence relative de la sous-population représentée. La couleur de la case correspond au résidu du test du χ² : les cases en rouge sont sous-représentées, les cases en bleu sur-représentées, et les cases blanches sont statistiquement proches de l’hypothèse d’indépendance.
3.3 > Exercice
Dans le le tableau ci-dessous figurent en colonnes le nombre de réponses à la question “Faites-vous faire des recherches sur internet à vos élèves ?” posée à 179 enseignants de collèges en France :
Construire le data.frame dans R.
Convertir les valeurs en pourcentage par ligne, colonne et total
Attention, vous devez dans un premier temps convertir votre data.frame en matrix…
Vous pouvez également essayer de représenter graphiquement vos pourcentages à l’aide de la fonction barplot().
- Existe-t-il un lien statistique entre ces deux variables?
3.4 Qualitatif vs Quantitatif
3.4.1 Représentations graphiques
Dans un premier temps, il s’agit de résumer visuellement la distribution statistique d’une variable quantitative autour de différentes mesures de centralité et de dispersion. La boîte à moustache boxplot() montre la distribution de la variable quantitative pour chacune des modalités de la variable qualitative.
# Fonction mosaicplot()
boxplot(hdv2003$heures.tv ~ hdv2003$qualif,
col="firebrick3",
ylab="heures TV",
las=2)Si une variable qualitative ne présente que deux modalités, la representation côte à côte des deux distributions permet d’observer facilement leurs différences :
# Construction du tableau croisé, en format data.frame
tab <- as.data.frame(lprop(table(hdv2003$sport, hdv2003$age)))
colnames(tab) <- c("sport", "age", "Freq")
tab <- subset(tab , !(sport %in% "Ensemble"))
# Utilisation de la fonction ggplot()
ggplot(tab , aes(x = age, y = Freq, fill = factor(sport))) +
geom_bar(stat = "identity", position = position_dodge(), las=2) +
ylab("Pourcentage")+
scale_x_discrete(breaks=seq(17,97,3), labels = seq(17,97,3))+
scale_y_continuous(limit=c(0,3.3))3.4.2 Calculs d’indicateurs
On peut vouloir comparer certains indicateurs (moyenne, médiane) d’une variable quantitative selon les modalités d’une variable qualitative.
Pour cela, il suffit de ventiler notre population en autant de sous-populations qu’il y a de modalités dans la variable qualitative. Vous pouvez par exemple utiliser la fonction filter() du package dplyr :
library(dplyr)
# On crée deux tables. Une avec la population qui fait du sport et l'autre qui n'en fait pas.
hdv2003_sport <- filter(hdv2003, sport == "Oui")
hdv2003_nonsport <- filter(hdv2003, sport == "Non")
# Moyenne d'age des gens qui pratique du sport
mean(hdv2003_sport$age)## [1] 40.92531
## [1] 52.25137
Plus simplement, vous pouvez utiliser la fonction tapply(), qui prend en paramètre une variable quantitative, qualitative et une fonction, puis applique automatiquement la fonction aux valeurs de la variables quantitative pour chaque niveau de la variable qualitative. Ex :
## Non Oui
## 52.25137 40.92531
3.5 Deux variables quantitatives
3.5.1 Représentation graphique
Lorsque l’on croise deux variables quantitatives, l’idéal est de faire une représentation graphique sous forme de nuage de points. Cela permet de visualiser l’existence d’un lien entre les deux variables et de ne pas faire d’erreurs d’interprétation.
Figure : Différentes séries statistiques… aux paramètres identiques
Source : http://blog.revolutionanalytics.com/2017/05/the-datasaurus-dozen.html
Le jeu de données hdv2003 comportant assez peu de variables quantitatives, on va s’intéresser maintenant à un jeu de données du recensement de la population de 2012 (rp2012) :
Représentation du nuage de point :
Il s’agit de la représentation la plus simple. Mais il est possible de fortement personnaliser ce graphique :
# Representation en nuage de points
# fonction plot()
par(bg = "ivory", mar = c(2,2,2,2), family="")
plot(x = rp2012$cadres, y = rp2012$dipl_sup, asp = 1, pch = 21, col = "white",
ylim = c(0,60), cex = 0.5, bg = "red", lwd = 0.5, axes = F)
axis(side = 1, at = seq(from = 0,to = 60, by = 10), cex.axis = 0.8,
pos = 0, tck=-0.01, padj = -1)
axis(side = 2, at = seq(from = 0,to = 60, by = 10), cex.axis = 0.8,
labels = c("", seq(from = 10,to = 60, by = 10) ), pos = 0, tck=-0.01, las = 2)
mtext(text = "Relation entre niveau d'étude et CSP", side = 3, line = 0.75,
adj = 0,font = 4)
mtext(text = "Diplômés du supérieur (%)", side = 2, line = 1)
mtext(text = "Cadres (%)", side = 1, line = 1)Les différentes formes classiques de relation entre 2 variables :
Source : https://eric.univ-lyon2.fr/~ricco/cours/cours/Analyse_de_Correlation.pdf
3.5.2 Calcul d’indicateurs
En plus d’une représentation graphique, on peut calculer certains indicateurs permettant de mesurer le degré d’association de deux variables quantitatives.
3.5.2.1 Corrélation linéaire (Pearson)
La corrélation est une mesure du lien d’association linéaire entre deux variables quantitatives. Sa valeur varie entre -1 et 1. Si la corrélation vaut -1, il s’agit d’une association linéaire négative parfaite. Si elle vaut 1, il s’agit d’une association linéaire positive parfaite. Si elle vaut 0, il n’y a aucune association linéaire entre les variables. Le calcul du coéfficient linéaire pet se fair à l’aide de la fonction cor.test().
##
## Pearson's product-moment correlation
##
## data: rp2012$cadres and rp2012$dipl_sup
## t = 193.1, df = 5168, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## 0.9337577 0.9403985
## sample estimates:
## cor
## 0.9371629
Dans ce cas, le coefficient est extrêmement fort. Il y a donc un lien linéaire et positif entre les deux variables (quand la valeur de l’une augmente, la valeur de l’autre augmente également).
3.5.2.2 Corrélation des rangs (Spearman)
Si les deux variables ne semblent pas être corrélées de façon linéaire et que l’on est en présence d’une relation monotone (c’est à dire que les variables ont tendance à se déplacer dans la même direction relative), on peut utiliser le coefficient de corrélation des rangs de Spearman.
Plutôt que de se baser sur les valeurs des variables, cette corrélation va se baser sur leurs rangs, c’est-à-dire sur leur position parmi les différentes valeurs prises par les variables.
Ainsi, si la valeur la plus basse de la première variable est associée à la valeur la plus basse de la deuxième, et ainsi de suite jusqu’à la valeur la plus haute, on obtiendra une corrélation de 1. Si la valeur la plus forte de la première variable est associée à la valeur la plus faible de la seconde, et ainsi de suite, et que la valeur la plus faible de la première est associée à la plus forte de la deuxième, on obtiendra une corrélation de -1. Si les rangs sont “mélangés”, sans rapports entre eux, on obtiendra une corrélation autour de 0.
Pour calculer une corrélation de Spearman, on utilise la fonction cor() mais avec l’argument method = “spearman” :
# Calcul coefficient de Corrélation de Spearman
cor(rp2012$cadres, rp2012$dipl_sup, method = "spearman")## [1] 0.9036273
3.5.3 Régression linéaire
Dans le cas particulier où l’on a pu mettre en évidence l’existence d’une relation linéaire significative entre deux caractères quantitatifs continus X et Y, on peut chercher à formaliser la relation moyenne qui unit ces deux variables à l’aide des équations suivantes :
Y = aX + b = droite de régression de Y en fonction de X
X = aY + b = droite de régression de X en fonction de Y
La régression consiste à évaluer les paramètres d’une fonction linéaire, puis d’estimer à l’aide de cette fonction les valeurs de la variable à expliquer et à tester si les différences (= les résidus) entre valeurs mesurées et valeurs estimées s’écartent de manière significative de 0.
##
## Call:
## lm(formula = rp2012$cadres ~ rp2012$dipl_sup)
##
## Coefficients:
## (Intercept) rp2012$dipl_sup
## 0.9217 1.0816
lm() nous renvoit par défaut les coefficients de la droite de régression, où :
Y = % de cadres X = % diplomé du supérieur
b = ordonnée à l’origine (Intercept) vaut 0.92
a = le coefficient associé à dipl_sup vaut 1.08
La regression linéaire de Y en fonction de X ( Y = aX + b ) équivaut donc à Y = 1.08X + 0.92
3.5.3.1 Coefficient de détermination (R2)
Le coefficient de détermination (R2) est une mesure de la qualité de la prédiction d’une regression linéaire. Il donne la part de la variance expliquée par l’équation de la régression dans la variance totale du nuage de points.
# Pour des résultats plus détaillés, fonction summary :
summary(lm(rp2012$cadres ~ rp2012$dipl_sup))##
## Call:
## lm(formula = rp2012$cadres ~ rp2012$dipl_sup)
##
## Residuals:
## Min 1Q Median 3Q Max
## -33.218 -1.606 -0.172 1.491 13.001
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.921661 0.071814 12.83 <2e-16 ***
## rp2012$dipl_sup 1.081636 0.005601 193.10 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 2.701 on 5168 degrees of freedom
## Multiple R-squared: 0.8783, Adjusted R-squared: 0.8783
## F-statistic: 3.729e+04 on 1 and 5168 DF, p-value: < 2.2e-16
3.5.3.2 Représentation graphique
On peut enfin représenter la droite de régression sur notre nuage de points à l’aide de la fonction abline() :
# plot()
plot(rp2012$dipl_sup, rp2012$cadres)
# Droite de regression - abline(lm())
abline(lm(rp2012$cadres ~ rp2012$dipl_sup), col="red", lwd=2)
text(6, 55, "y = 1.08x + 0.92", col="red")3.5.4 Les résidus
Les résidus d’une regression expriment l’écart entre les valeurs observées et les valeurs prédites par le modèle. Plus un individu aura des résidus fort (positifs ou négatif), moins sa position sera expliquée par le modèle. Il faudra alors trouver d’autres facteurs explicatifs.
Calculer les résidus :
# Regression lineaire
my_reg <- lm(rp2012$cadres ~ rp2012$dipl_sup)
# construction d'un data.frame des résidus normalisés
residus <- data.frame(scaledRes = scale(my_reg$residuals), nom = row.names(rp2012))Représenter les résidus :
# on ne garde que le nom des individus ayant des résidus trés élevés (sup à 4 ecarts-type)
residus[residus$scaledRes < 4 & residus$scaledRes > -4, "nom"] <- NA
# affichage des résidus
plot(residus$scaledRes, cex = .5, pch = 20, ylim=c(-5,5))
# intervalles exprimés en ecart-type
abline(h = 0, lwd = 2, col = "red")
abline(h = 4, lty = 2)
abline(h = -4, lty = 2)
# affichage du nom des individus extraordinaires
text(x= 1:nrow(residus), y = residus$scaledRes, labels = residus$nom, pos = 4,
cex = 0.7, offset = c(.2,0), font = 2)3.6 > Exercice
Créez un nouveau projet
Décrivez le jeu de données “women”
Le jeu de données women est un jeu de données fourni par le package datasets installé par défaut.
Quelles sont les unités de mesure des variables?
- Créer deux nouvelles variables (taille et poids) dans des unités de mesures plus compréhensibles.
Arrondir les valeurs pour une meilleur lisibilité (avec quelles fonction?).
Créer un graphique mettant en relation les deux variables (poids et taille)
Quelle hypothèse pouvons nous faire? Et comment la vérifier?
Quelle est la relation entre poids et taille.
Comment modéliser cette relation
Quel serait le poids d’une femme d’1.68 m?
Afficher la droite de regression du modèle sur le graphique.
4 Sources & références
Il existe de trés nombreuses ressources documentaires sur R, disponible en libre accès sur le web. Plusieurs ressources de qualité, parfois largement utilisées pour produire ce document, sont référencées sur le site de partage et de diffusion Rzine (onglet ressources) :
COMITÉ ÉDITORIAL RZINE, 2021a. Processus de relecture d’une fiche [en ligne]. S.l. : Rzine. Disponible à l'adresse : https://rzine.gitpages.huma-num.fr/help_rzine_reviewing/.
COMITÉ ÉDITORIAL RZINE, 2021b. Processus de soumission d’une fiche [en ligne]. S.l. : Rzine. Disponible à l'adresse : https://rzine.gitpages.huma-num.fr/help_rzine_submit/.
COMITÉ ÉDITORIAL RZINE, 2021c. Rédiger une fiche [en ligne]. S.l. : Rzine. Disponible à l'adresse : https://rzine.gitpages.huma-num.fr/Help_Rzine_Layout/.